Prerequisites

Platform

The source data contains traditional Chinese characters encoded in UTF-8. To avoid troublesome encoding issues (especially in a Windows platform with a default CP1252 code page), the codes in this notebook are only tested on Ubuntu and macOS. Codes are in general still working under Windows. Just that some code chunks may not be able to print out unicode characters nicely.

Data

Election Data

We use minimally pre-processed data for our analytics. Please refer to the repo TW_Presidential_Election_2020 for details about the pre-processing logic. To directly download the archives please visit here. We put the uncompressed files under data/processed at our project root directory.

Map Data

For Taiwan map information, the shp file (shapefile) can be downloaded at GADM.org. We put the unzipped files under data/map at our project root directory.

Dependencies

Additional dependencies are required for Linux machine in order to do map plotting. Here is the instruction for Ubuntu.

Install gdal:

sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt update
sudo apt install libgdal-dev

Install ubunits:

sudo apt install libudunits2-dev

After installation of the above packages, we can then install and import the following R packages for this project:

library(data.table)

# For viualization.
library(ggplot2)
library(ggrepel)
library(plotly)

# Fix macOS ggplot device to locate a Chinese font.
# To make `knitr` aware of this we also need to speficy `fig.showtext=TRUE` for chunks with ggplot output.
library(showtext)
font_add_google("Noto Serif TC", "noto")
showtext_auto()

# For spatial data visualization.
library(sf)

# For linear modeling with robust std err.
library(lmtest)
library(sandwich)

References on R Packages

Berger, Susanne, Nathaniel Graham, and Achim Zeileis. 2017. “Various Versatile Variances: An Object-Oriented Implementation of Clustered Covariances in R.” Working Paper 2017-12. Working Papers in Economics; Statistics, Research Platform Empirical; Experimental Economics, Universität Innsbruck. http://EconPapers.RePEc.org/RePEc:inn:wpaper:2017-12.

Dowle, Matt, and Arun Srinivasan. 2019. Data.table: Extension of ‘Data.frame‘. https://CRAN.R-project.org/package=data.table.

Pebesma, Edzer. 2018. “Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.

Qiu, Yixuan, and authors/contributors of the included software. See file AUTHORS for details. 2019. Showtext: Using Fonts More Easily in R Graphs. https://CRAN.R-project.org/package=showtext.

Sievert, Carson. 2018. Plotly for R. https://plotly-r.com.

Slowikowski, Kamil. 2019. Ggrepel: Automatically Position Non-Overlapping Text Labels with ’Gplot2’. https://CRAN.R-project.org/package=ggrepel.

Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.

Zeileis, Achim, and Torsten Hothorn. 2002. “Diagnostic Checking in Regression Relationships.” R News 2 (3): 7–10. https://CRAN.R-project.org/doc/Rnews/.

LS0tCnRpdGxlOiAiVmlzdWFsaXphdGlvbiBmb3IgVFcgR2VuZXJhbCBFbGVjdGlvbiIKc3VidGl0bGU6ICIyMDIwIFByZXNpZGVudGlhbCBhbmQgTGVnaXNsYXRpdmUgUmVzdWx0cyIKYXV0aG9yOgotIG5hbWU6IEt5bGUgQ2h1bmcKICBhZmZpbGlhdGlvbjoKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJWIgJVknKWAgTGFzdCBVcGRhdGVkICgxOSBKYW4gMjAyMCBGaXJzdCBVcGxvYWRlZCkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBmaWdfd2lkdGg6IDguMzMKICAgIGZpZ19oZWlnaHQ6IDYuMjUKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGluY2x1ZGVzOgogICAgICBpbl9oZWFkZXI6IC90bXAvbWV0YV9oZWFkZXIuaHRtbAogICAgdGhlbWU6IHBhcGVyCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBjb2RlX2Rvd25sb2FkOiB0cnVlCmJpYmxpb2dyYXBoeTogdHdfZWxlY3Rpb25fMjAyMC5iaWIKbm9jaXRlOiB8CiAgQGRhdGEudGFibGUKICBAZ2dwbG90MgogIEBnZ3JlcGVsCiAgQHBsb3RseQogIEBzaG93dGV4dAogIEBzZgogIEBsbXRlc3QKICBAc2FuZHdpY2gKbGluay1jaXRhdGlvbnM6IHllcwphYnN0cmFjdDogfAogIFRoZSBub3RlYm9vayBwcm92aWRlcyBhIHZpc3VhbCBkZXNjcmlwdGlvbiBvbiB0aGUgMjAyMCBUYWl3YW5lc2UgcHJlc2lkZW50aWFsIGFuZCBsZWdpc2xhdGl2ZSBlbGVjdGlvbiByZXN1bHRzLiBUaGUgcG9sbGluZyB0b29rIHBsYWNlIGF0IDIwMjAtMDEtMTEgYW5kIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkIGJ5IENlbnRyYWwgRWxlY3Rpb24gQ29tbWlzaW9uIChDRUMpIGF0IHRoZSBwb2xsaW5nIHBsYWNlIGxldmVsLgotLS0KCmBgYHtyIG1ldGEsIGluY2x1ZGU9RkFMU0V9Cm1ldGFfaGVhZGVyX2ZpbGUgPC0gZmlsZSgiL3RtcC9tZXRhX2hlYWRlci5odG1sIikKCiMgQWRkIG9wZW4gZ3JhcGggbWV0YS4KbWV0YSA8LSBjKAogICc8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9Ikt5bGUgQ2h1bmciPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzp0aXRsZSIgY29udGVudD0iMjAyMCBUYWl3YW5lc2UgUHJlc2lkZW50aWFsIEVsZWN0aW9uIERhdGEiPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzp0eXBlIiBjb250ZW50PSJhcnRpY2xlIj4nLAogICc8bWV0YSBwcm9wZXJ0eT0ib2c6dXJsIiBjb250ZW50PSJodHRwczovL2V2ZXJkYXJrLmdpdGh1Yi5pby9rOS9wcm9qZWN0cy90d19lbGVjdGlvbl8yMDIwL3R3X2VsZWN0aW9uXzIwMjAubmIuaHRtbCI+JywKICAnPG1ldGEgcHJvcGVydHk9Im9nOmltYWdlIiBjb250ZW50PSJodHRwczovL2V2ZXJkYXJrLmdpdGh1Yi5pby9rOS9hc3NldHMvYm9vdC5wbmciPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzpkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkYXRhIHNjaWVuY2Ugbm90ZWJvb2sgYWJvdXQgMjAyMCBUYWl3YW5lc2UgcHJlc2lkZW50aWFsIGVsZWN0aW9uLiI+JwopCmNvbnRlbnRzIDwtIG1ldGEKCiMgQWRkIEdpdGh1YiBjb3JuZXIuCmdpdGh1Yl9jb3JuZXJfc3ZnIDwtICIuLi8uLi9hc3NldHMvZ2l0aHViX2Nvcm5lci5odG1sIgpnaXRodWJfY29ybmVyX2NvbmYgPC0gbGlzdChnaXRodWJfbGluaz0iaHR0cHM6Ly9naXRodWIuY29tL2V2ZXJkYXJrL2s5L3RyZWUvbWFzdGVyL3Byb2plY3RzL3R3X2VsZWN0aW9uXzIwMjAiKQpjb250ZW50cyA8LSBjKGNvbnRlbnRzLCBzdHJpbmdyOjpzdHJfaW50ZXJwKHJlYWRMaW5lcyhnaXRodWJfY29ybmVyX3N2ZyksIGdpdGh1Yl9jb3JuZXJfY29uZikpCndyaXRlTGluZXMoY29udGVudHMsIG1ldGFfaGVhZGVyX2ZpbGUpCgpjbG9zZShtZXRhX2hlYWRlcl9maWxlKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLmFsaWduPSJjZW50ZXIiKQpgYGAKCiMgUHJlcmVxdWlzaXRlcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIFBsYXRmb3JtCgpUaGUgc291cmNlIGRhdGEgY29udGFpbnMgdHJhZGl0aW9uYWwgQ2hpbmVzZSBjaGFyYWN0ZXJzIGVuY29kZWQgaW4gVVRGLTguClRvIGF2b2lkIHRyb3VibGVzb21lIGVuY29kaW5nIGlzc3VlcyAoZXNwZWNpYWxseSBpbiBhIFdpbmRvd3MgcGxhdGZvcm0gd2l0aCBhIGRlZmF1bHQgYENQMTI1MmAgY29kZSBwYWdlKSwKdGhlICoqY29kZXMgaW4gdGhpcyBub3RlYm9vayBhcmUgb25seSB0ZXN0ZWQgb24gVWJ1bnR1IGFuZCBtYWNPUy4qKgpDb2RlcyBhcmUgaW4gZ2VuZXJhbCBzdGlsbCB3b3JraW5nIHVuZGVyIFdpbmRvd3MuCkp1c3QgdGhhdCBzb21lIGNvZGUgY2h1bmtzIG1heSBub3QgYmUgYWJsZSB0byBwcmludCBvdXQgdW5pY29kZSBjaGFyYWN0ZXJzIG5pY2VseS4KCiMjIERhdGEKCiMjIyBFbGVjdGlvbiBEYXRhIHstfQoKV2UgdXNlIG1pbmltYWxseSBwcmUtcHJvY2Vzc2VkIGRhdGEgZm9yIG91ciBhbmFseXRpY3MuClBsZWFzZSByZWZlciB0byB0aGUgcmVwbyBbVFdfUHJlc2lkZW50aWFsX0VsZWN0aW9uXzIwMjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ldmVyZGFyay9UV19QcmVzaWRlbnRpYWxfRWxlY3Rpb25fMjAyMCkgZm9yIGRldGFpbHMgYWJvdXQgdGhlIHByZS1wcm9jZXNzaW5nIGxvZ2ljLgpUbyBkaXJlY3RseSBkb3dubG9hZCB0aGUgYXJjaGl2ZXMgcGxlYXNlIHZpc2l0IFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vZXZlcmRhcmsvVFdfUHJlc2lkZW50aWFsX0VsZWN0aW9uXzIwMjAvcmVsZWFzZXMvbGF0ZXN0KS4KV2UgcHV0IHRoZSB1bmNvbXByZXNzZWQgZmlsZXMgdW5kZXIgYGRhdGEvcHJvY2Vzc2VkYCBhdCBvdXIgcHJvamVjdCByb290IGRpcmVjdG9yeS4KCiMjIyBNYXAgRGF0YSB7LX0KCkZvciBUYWl3YW4gbWFwIGluZm9ybWF0aW9uLAp0aGUgYHNocGAgZmlsZSAoW3NoYXBlZmlsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2hhcGVmaWxlKSkgY2FuIGJlIGRvd25sb2FkZWQgYXQgW0dBRE0ub3JnXShodHRwczovL2dhZG0ub3JnL2Rvd25sb2FkX2NvdW50cnlfdjMuaHRtbCkuCldlIHB1dCB0aGUgdW56aXBwZWQgZmlsZXMgdW5kZXIgYGRhdGEvbWFwYCBhdCBvdXIgcHJvamVjdCByb290IGRpcmVjdG9yeS4KCiMjIERlcGVuZGVuY2llcwoKQWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgYXJlIHJlcXVpcmVkIGZvciBMaW51eCBtYWNoaW5lIGluIG9yZGVyIHRvIGRvIG1hcCBwbG90dGluZy4KSGVyZSBpcyB0aGUgaW5zdHJ1Y3Rpb24gZm9yIFVidW50dS4KCkluc3RhbGwgW2BnZGFsYF0oaHR0cHM6Ly9nZGFsLm9yZy8pOgoKYGBgc2gKc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOnVidW50dWdpcy91YnVudHVnaXMtdW5zdGFibGUKc3VkbyBhcHQgdXBkYXRlCnN1ZG8gYXB0IGluc3RhbGwgbGliZ2RhbC1kZXYKYGBgCgpJbnN0YWxsIGB1YnVuaXRzYDoKCmBgYHNoCnN1ZG8gYXB0IGluc3RhbGwgbGlidWR1bml0czItZGV2CmBgYAoKQWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIHRoZSBhYm92ZSBwYWNrYWdlcywKd2UgY2FuIHRoZW4gaW5zdGFsbCBhbmQgaW1wb3J0IHRoZSBmb2xsb3dpbmcgUiBwYWNrYWdlcyBmb3IgdGhpcyBwcm9qZWN0OgoKYGBge3IgaW1wb3J0LCByZXN1bHRzPSJoaWRlIiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2xhc3Muc291cmNlPSJmb2xkLXNob3cifQpsaWJyYXJ5KGRhdGEudGFibGUpCgojIEZvciB2aXVhbGl6YXRpb24uCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KHBsb3RseSkKCiMgRml4IG1hY09TIGdncGxvdCBkZXZpY2UgdG8gbG9jYXRlIGEgQ2hpbmVzZSBmb250LgojIFRvIG1ha2UgYGtuaXRyYCBhd2FyZSBvZiB0aGlzIHdlIGFsc28gbmVlZCB0byBzcGVmaWN5IGBmaWcuc2hvd3RleHQ9VFJVRWAgZm9yIGNodW5rcyB3aXRoIGdncGxvdCBvdXRwdXQuCmxpYnJhcnkoc2hvd3RleHQpCmZvbnRfYWRkX2dvb2dsZSgiTm90byBTZXJpZiBUQyIsICJub3RvIikKc2hvd3RleHRfYXV0bygpCgojIEZvciBzcGF0aWFsIGRhdGEgdmlzdWFsaXphdGlvbi4KbGlicmFyeShzZikKCiMgRm9yIGxpbmVhciBtb2RlbGluZyB3aXRoIHJvYnVzdCBzdGQgZXJyLgpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKYGBgCgojIEJhY2tncm91bmQKCisgWzIwMjAgMTB0aCBUYWl3YW5lc2UgUHJlc2lkZW50aWFsIEVsZWN0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8yMDIwX1RhaXdhbmVzZV9wcmVzaWRlbnRpYWxfZWxlY3Rpb24pCisgWzIwMjAgMTV0aCBUYWl3YW5lc2UgTGVnaXNsYXRpdmUgRWxlY3Rpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLzIwMjBfVGFpd2FuZXNlX2xlZ2lzbGF0aXZlX2VsZWN0aW9uKQoKIyBWaXN1YWwgQW5hbHl0aWNzIG9uIEVsZWN0aW9uIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHMgI2hlYWR9CgojIyDnrKzljYHkupTlsYbnuL3ntbHpgbjoiInntZDmnpwgVGhlIDE1dGggUHJlc2lkZW50aWFsIEVsZWN0aW9uIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMg5pyJ5pWI56WoIFZhbGlkIFZvdGUgQ291bnRzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIyBCeSBDb3VudHkKCmBgYHtyIHBhcnNlX3R3X2NvdW50eV9tYXB9CiMgUmVhZCBzaGFwZWZpbGUgZm9yIHNwYXRpYWwgaW5mb3JtYXRpb24gYWJvdXQgY291bnRpZXMgaW4gVGFpd2FuLgp0d19jb3VudHlfc2YgPC0gc2Y6OnN0X3JlYWQoImRhdGEvbWFwL2dhZG0zNl9UV05fMi5zaHAiLCBxdWlldD1UUlVFKQoKIyBBbGlnbiBjb3VudHkgbmFtaW5nLgp0d19jb3VudHlfc2YkTkxfTkFNRV8yIDwtIGdzdWIoIuWPsOS4rSIsICLlj7DkuK3luIIiLCB0d19jb3VudHlfc2YkTkxfTkFNRV8yKQp0d19jb3VudHlfc2YkTkxfTkFNRV8yIDwtIGdzdWIoIuWPsOWNlyIsICLlj7DljZfluIIiLCB0d19jb3VudHlfc2YkTkxfTkFNRV8yKQp0d19jb3VudHlfc2YkTkxfTkFNRV8yIDwtIGdzdWIoIummrOelluWIl+WztiIsICLpgKPmsZ/nuKMiLCB0d19jb3VudHlfc2YkTkxfTkFNRV8yKQpgYGAKCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX2NvdW50eSwgcmVzdWx0cz0iaGlkZSJ9CiMgcHJvY2VzcyBjb3VudHktbGV2ZWwgcHJlc2lkZW50aWFsIGVsZWN0aW9uIHJlc3VsdHMuCnBfY291bnR5IDwtIGZyZWFkKCJkYXRhL3Byb2Nlc3NlZC9wcmVzaWRlbnRpYWwvcHJlc2lkZW50aWFsX2NvdW50aWVzLmNzdiIsIGVuY29kaW5nPSJVVEYtOCIpCnBfY291bnR5IDwtIHBfY291bnR5WywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCnBfY291bnR5IDwtIHBfY291bnR5WywgUmVnaW9uOj1nc3ViKCLoh7oiLCAi5Y+wIiwgUmVnaW9uKV0gICMgQWxpZ24gY2hhcmFjdGVyIHdpdGggc2hhcGVmaWxlLgpzZXRuYW1lcyhwX2NvdW50eSwgIuaKleelqOeOh0ggSD1Dw7dHIiwgIlR1cm5vdXQiKQoKIyBGaW5hbCBjb3VudHMuCmNvbHNfY2FuZGlkYXRlIDwtIGMoIigxKSDlrovmpZrnkZwg5L2Z5rmYIiwgIigyKSDpn5PlnIvnkZwg5by15ZaE5pS/IiwgIigzKSDolKHoi7Hmlocg6LO05riF5b63IikKcF9maW5hbCA8LSBhcy5kYXRhLnRhYmxlKGNvbFN1bXMocF9jb3VudHlbLCBjb2xzX2NhbmRpZGF0ZSwgd2l0aD1GQUxTRV0pLCBrZWVwLnJvd25hbWVzPVRSVUUpCnNldG5hbWVzKHBfZmluYWwsIGMoIkNhbmRpZGF0ZSIsICJWb3RlcyIpKQpwX2ZpbmFsIDwtIHBfZmluYWxbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpXQoKIyBNZXJnZSB3aXRoIHNocCB0byBnZXQgRW5nbGlzaCBjb3VudHkgbmFtZS4KcF9jb3VudHkgPC0gbWVyZ2UocF9jb3VudHksIHR3X2NvdW50eV9zZlssIGMoIk5MX05BTUVfMiIsICJOQU1FXzIiKV0sCiAgICAgICAgICAgICAgICAgIGJ5Lnk9Ik5MX05BTUVfMiIsIGJ5Lng9IlJlZ2lvbiIpCnBfY291bnR5JGdlb21ldHJ5IDwtTlVMTApzZXRuYW1lcyhwX2NvdW50eSwgIk5BTUVfMiIsICJSZWdpb25FbiIpCnBfY291bnR5IDwtIHBfY291bnR5WywgQ291bnR5Oj1wYXN0ZShSZWdpb24sIFJlZ2lvbkVuKV0KCiMgTWVsdCBmcm9tIHdpZGUgdG8gbG9uZyBmb3IgcGxvdHRpbmcgcHVycG9zZS4KY29sc19yZWdpb24gPC0gYygiQ291bnR5IiwgIlJlZ2lvbiIsICJSZWdpb25FbiIpCnBfY291bnR5X2wgPC0gbWVsdChwX2NvdW50eVssIGMoY29sc19yZWdpb24sIGNvbHNfY2FuZGlkYXRlKSwgd2l0aD1GQUxTRV0sCiAgICAgICAgICAgICAgICAgICBpZC52YXJzPWNvbHNfcmVnaW9uLCB2YXJpYWJsZS5uYW1lPSJDYW5kaWRhdGUiLCB2YWx1ZS5uYW1lPSJWb3RlcyIpCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIENhbmRpZGF0ZTo9ZmFjdG9yKENhbmRpZGF0ZSldICAjIExldmVsIGJ5IGNhbmRpZGF0ZSBudW1iZXIuCgojIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIERQUCBhbmQgS01UIGJ5IGNvdW50eS4Kc2V0b3JkZXIocF9jb3VudHlfbCwgQ291bnR5LCBDYW5kaWRhdGUpCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIFZvdGVzX0RpZmY6PVZvdGVzWzNdIC0gVm90ZXNbMl0sIGJ5PS4oQ291bnR5KV0KCiMgQ29tcHV0ZSB0b3RhbCB2b3RlcyBieSBjb3VudHkuCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIFRvdGFsX1ZvdGVzOj1zdW0oVm90ZXMpLCBieT0uKENvdW50eSldCgojIENvbXB1dGUgc2hhcmUgYnkgY291bnR5LgpwX2NvdW50eV9sIDwtIHBfY291bnR5X2xbLCBWb3Rlc19TaGFyZTo9Vm90ZXMgLyBUb3RhbF9Wb3Rlc10KcF9jb3VudHlfbCA8LSBwX2NvdW50eV9sWywgU2hhcmVfRGlmZjo9Vm90ZXNfU2hhcmVbM10gLSBWb3Rlc19TaGFyZVsyXSwgYnk9LihDb3VudHkpXQpwX2NvdW50eV9kaWZmIDwtIHVuaXF1ZShwX2NvdW50eV9sLCBieT0iQ291bnR5IilbCiAgLCBjKGNvbHNfcmVnaW9uLCAiVG90YWxfVm90ZXMiLCAiU2hhcmVfRGlmZiIpLCB3aXRoPUZBTFNFXQpwX2NvdW50eV9kaWZmIDwtIHBfY291bnR5X2RpZmZbLCBkcHBfd2luOj1TaGFyZV9EaWZmID4gMF0KCiMgSm9pbiBzaGFyZSBkaWZmIHRvIHNwYXRpYWwgZGF0YWZyYW1lLgp0d19jb3VudHlfc2YgPC0gbWVyZ2UodHdfY291bnR5X3NmLCBwX2NvdW50eV9kaWZmLCBieS54PSJOTF9OQU1FXzIiLCBieS55PSJSZWdpb24iKQoKIyBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBEUFAgYW5kIEtNVCBvbiB0aGUgd2lkZSBkYXRhIGFzIHdlbGwuCnBfY291bnR5IDwtIHBfY291bnR5WywgVm90ZV9EaWZmOj1nZXQoIigzKSDolKHoi7Hmlocg6LO05riF5b63IikgLSBnZXQoIigyKSDpn5PlnIvnkZwg5by15ZaE5pS/IildCnBfY291bnR5IDwtIHBfY291bnR5WywgU2hhcmVfRGlmZjo9Vm90ZV9EaWZmIC8gZ2V0KCLmnInmlYjnpajmlbhBIEE9MSsyKy4uLitOIildCgojIENvbG9yIGNvbmZpZ3VyYXRpb24gZm9yIG1haW4gcGFydGllcy4KbWFpbl9wYXJ0eV9jb2xvcnMgPC0gYygiZGFya29yYW5nZSIsICJkb2RnZXJibHVlIiwgImdyZWVuMyIpCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX2ZpbmFsX3Jlc3VsdCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIEZpbmFsIE91dGNvbWUifQpnZ3Bsb3QocF9maW5hbCwgYWVzKHg9Q2FuZGlkYXRlLCB5PVZvdGVzLCBmaWxsPUNhbmRpZGF0ZSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsKICBsYWJzKHg9IuWAmemBuOS6uiIsIHk9IuW+l+elqOaVuCIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOe1kOaenCIpICsKICBnZW9tX3RleHQoYWVzKHg9Q2FuZGlkYXRlLCB5PVZvdGVzIC8gMiwKICAgICAgICAgICAgICAgIGxhYmVsPXNwcmludGYoIiVzXG4oJXMpIiwgc2NhbGVzOjpjb21tYShWb3RlcyksIHNjYWxlczo6cGVyY2VudChTaGFyZSkpKSwKICAgICAgICAgICAgc2l6ZT01KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPW1haW5fcGFydHlfY29sb3JzKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGNvb3JkX2ZsaXAoKQpgYGAKClRoZSBwcmUtcHJvY2Vzc2VkIGNvdW50eSByZXN1bHQgZm9yIHByZXNpZGVudGlhbCBlbGVjdGlvbiBpcyBhICp3aWRlKiBmb3JtYXQgYnkgY291bnR5OgoKYGBge3Igc2hvd19wcmVzaWRlbnRpYWxfY291bnR5X3Jlc3VsdH0KaGVhZChwX2NvdW50eVssIC1jKDE6MyldKQpgYGAKCkFuZCB3ZSd2ZSByZXNoYXBlZCBpdCBpbnRvIGEgKmxvbmcqIGZvcm1hdCBmb3IgZWFzZSBvZiBwbG90dGluZzoKCmBgYHtyIHNob3dfcHJlc2lkZW50aWFsX3RhaWVwaX0KIyBTaG93IHJlc3VsdCBmb3IgVGFpcGVpLgpwX2NvdW50eV9sW1JlZ2lvbiA9PSAi5Y+w5YyX5biCIl0KYGBgCgpQbG90IHZvdGUgY291bnRzIGJ5IGNvdW50eToKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfYmFyLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlIENvdW50cyBieSBDb3VudHkifQpwIDwtIGdncGxvdChwX2NvdW50eV9sLCBhZXMoeD1yZW9yZGVyKENvdW50eSwgVG90YWxfVm90ZXMpLCB5PVZvdGVzLCBmaWxsPUNhbmRpZGF0ZSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIsIHdpZHRoPS44KSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0i5YCZ6YG45Lq6IiwgdmFsdWVzPW1haW5fcGFydHlfY29sb3JzKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hKSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3nuL3npajmlbjmjpLluo/vvIkiLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlgJnpgbjkurrlkITnuKPluILvvJrlvpfnpajmlbgiKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKQW5kIGFsc28gdm90ZSBzaGFyZXMgKHZvdGUgY291bnRzIC8gdG90YWwgdmFsaWQgdm90ZXMpOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9iYXJfcGN0LCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlIFNoYXJlcyBieSBDb3VudHkifQpwIDwtIGdncGxvdChwX2NvdW50eV9sLCBhZXMoeD1yZW9yZGVyKENvdW50eSwgVG90YWxfVm90ZXMpLCB5PVZvdGVzX1NoYXJlLCBmaWxsPUNhbmRpZGF0ZSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJzdGFjayIsIHdpZHRoPS44KSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoVm90ZXNfU2hhcmUpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSLlgJnpgbjkuroiLCB2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+nee4veelqOaVuOaOkuW6j++8iSIsIHk9IuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWAmemBuOS6uuWQhOe4o+W4gu+8muW+l+elqOeOhyIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpTaW5jZSB0aGUgbWFpbiBwYXJ0aWVzIGFyZSBERFAgYW5kIEtNVCwKd2UgZGVmaW5lIHZvdGUgc2hhcmUgZGlmZmVyZW5jZSBhcyB2b3RlIHNoYXJlIG9mIEREUCBtaW51cyB0aGF0IG9mIEtNVC4KVGhlIGZvbGxvd2luZyBiYXJwbG90IGdpdmVzIHVzIGEgY2xlYXIgdmlldyBvZiB3aGljaCBjb3VudHkgRFBQIHdvbiB0aGUgbW9zdC4KCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfYmFyX3BjdF9kaWZmLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlIFNoYXJlIERpZmZlcmVuY2UgKERQUCdzIC0gS01UJ3MpIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5X2RpZmYsIGFlcyh4PXJlb3JkZXIoQ291bnR5LCBTaGFyZV9EaWZmKSwgZmlsbD1kcHBfd2luLCB5PVNoYXJlX0RpZmYpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgY29sb3I9ImJsYWNrIiwgYWxwaGE9LjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZG9kZ2VyYmx1ZSIsICJncmVlbjMiKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChTaGFyZV9EaWZmKSksIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PS41KSwgc2l6ZT0yLjUpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+neW+l+elqOeOh+W3ruaOkuW6j++8iSIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8mue2oOiXjeW+l+elqOeOh+W3riIpICsKICBjb29yZF9mbGlwKCkKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpXZSBjYW4gYWxzbyB2aXN1YWxpemUgdGhlIGFib3ZlIHJhbmtpbmcgd2l0aCBhIGNob3JvcGxldGggbWFwOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9tYXAsIGZpZy5jYXA9IkNob3JvcGxldGggTWFwIGZvciBWb3RlIFNoYXJlIERpZmZlcmVuY2VzIChEUFAncyAtIEtNVCdzKSJ9CnAgPC0gZ2dwbG90KHR3X2NvdW50eV9zZiwgYWVzKHRleHQ9Q291bnR5KSkgKwogIGdlb21fc2YoYWVzKGZpbGw9U2hhcmVfRGlmZikpICsKICBjb29yZF9zZih4bGltPWMoMTE4LCAxMjIuNSksIHlsaW09YygyMS41LCAyNi41KSkgKwogIHNjYWxlX2ZpbGxfZ3JhZGllbnQobmFtZT0i57ag6JeN5b6X56Wo546H5beuIiwgbG93PSJibHVlMyIsIGhpZ2g9ImdyZWVuMyIpICsKICBsYWJzKHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya57ag6JeN5b6X56Wo546H5beuIikKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpBcHBhcmVudGx5IERQUCB3b24gbW9zdCBjb3VudGllcyBiZXNpZGVzIG1haW50YWluIGFuZCBvdXRseWluZyBpc2xhbmQgYXJlYXMuCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIyBCeSBDb3VudHkgU3ViLVJlZ2lvbiB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX3JlZ2lvbiwgcmVzdWx0cz0iaGlkZSJ9CiMgUmVhZCBjb3VudHkgc3VicmVnaW9uLWxldmVsIHByZXNpZGVudGlhbCBlbGVjdGlvbiByZXN1bHRzLgpwX3JlZ2lvbiA8LSBmcmVhZCgiZGF0YS9wcm9jZXNzZWQvcHJlc2lkZW50aWFsL3ByZXNpZGVudGlhbF9yZWdpb25zLmNzdiIsIGVuY29kaW5nPSJVVEYtOCIpCnBfcmVnaW9uIDwtIHBfcmVnaW9uWywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCnNldG5hbWVzKHBfcmVnaW9uLCAi5oqV56Wo546HSCBIPUPDt0ciLCAiVHVybm91dCIpCgojIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIERQUCBhbmQgS01UIGJ5IHJlZ2lvbi4KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBWb3RlX0RpZmY6PWdldCgiKDMpIOiUoeiLseaWhyDos7TmuIXlvrciKSAtIGdldCgiKDIpIOmfk+Wci+eRnCDlvLXlloTmlL8iKV0KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBTaGFyZV9EaWZmOj1Wb3RlX0RpZmYgLyBnZXQoIuacieaViOelqOaVuEEgQT0xKzIrLi4uK04iKV0KCiMgV2lkZSB0byBsb25nLgpwX3JlZ2lvbl9sIDwtIG1lbHQocF9yZWdpb25bLCBjKCJCeSIsICJSZWdpb24iLCBjb2xzX2NhbmRpZGF0ZSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgICAgICAgaWQudmFycz1jKCJCeSIsICJSZWdpb24iKSwgdmFyaWFibGUubmFtZT0iQ2FuZGlkYXRlIiwgdmFsdWUubmFtZT0iVm90ZXMiKQpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbLCBDYW5kaWRhdGU6PWZhY3RvcihDYW5kaWRhdGUpXSAgIyBMZXZlbCBieSBjYW5kaWRhdGUgbnVtYmVyLgpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbcF9yZWdpb24sIFNoYXJlX0RpZmY6PWkuU2hhcmVfRGlmZiwgb249LihSZWdpb24pXQoKc2V0b3JkZXIocF9yZWdpb24sIC1TaGFyZV9EaWZmKQoKIyBHcm91cCBjb3VudGllcyBpbnRvIGFyZWFzLgpub3J0aF9jb3VudGllcyA8LSBjKCLoh7rljJfluIIiLCAi5paw5YyX5biCIiwgIuWfuumahuW4giIsICLmlrDnq7nluIIiLCAi5qGD5ZyS5biCIiwgIuaWsOeruee4oyIsICLlrpzomK3nuKMiKQpjZW50cmFsX2NvdW50aWVzIDwtIGMoIuiHuuS4reW4giIsICLoi5fmoJfnuKMiLCAi5b2w5YyW57ijIiwgIuWNl+aKlee4oyIsICLpm7LmnpfnuKMiKQpzb3V0aF9jb3VudGllcyA8LSBjKCLpq5jpm4TluIIiLCAi6Ie65Y2X5biCIiwgIuWYiee+qeW4giIsICLlmInnvqnnuKMiLCAi5bGP5p2x57ijIiwgIua+jua5lue4oyIpCmVhc3RfY291bnRpZXMgPC0gYygi6Iqx6JOu57ijIiwgIuiHuuadsee4oyIpCmlzbGFuZF9jb3VudGllcyA8LSBjKCLph5HploDnuKMiLCAi6YCj5rGf57ijIikKCiMgSGVscGVyIGZ1bmN0aW9uIGZvciBzaGFyZSBkaWZmZXJlbmNlIGJhciBwbG90LgpwbG90X3JlZ2lvbl9zaGFyZV9kaWZmIDwtIGZ1bmN0aW9uKGNvdW50aWVzLCB0aXRsZSkgewogIERUIDwtIHBfcmVnaW9uW0J5ICVpbiUgY291bnRpZXNdCiAgRFRbLCBCeTo9ZmFjdG9yKEJ5LCBsZXZlbHM9Y291bnRpZXMpXSAgIyBGaXggb3JkZXIgZm9yIGZhY2V0IGdyaWRzLgogIERUWywgUmVnaW9uMjo9cGFzdGUoQnksIFJlZ2lvbildICAjIEZpeGVkIG9yZGVyIHdpdGhpbiBmYWNldCAoc2FtZS1uYW1lIHJlZ2lvbiBmb3IgZGlmZmVyZW50IGNvdW50aWVzKS4KICBEVFssIGRwcF93aW46PVNoYXJlX0RpZmYgPiAwXQogIHAgPC0gZ2dwbG90KERULCBhZXMoeD1yZW9yZGVyKFJlZ2lvbjIsIFNoYXJlX0RpZmYpLCB5PVNoYXJlX0RpZmYsIGZpbGw9ZHBwX3dpbikpICsKICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGNvbG9yPSJibGFjayIsIGFscGhhPS41KSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZG9kZ2VyYmx1ZSIsICJncmVlbjMiKSkgKwogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgICBsYWJzKHg9IiIsIHk9IiIsIHRpdGxlPXRpdGxlKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgZmFjZXRfZ3JpZChCeSB+IC4sIHNjYWxlcz0iZnJlZV95Iiwgc3BhY2U9ImZyZWVfeSIpCiAgcAp9CmBgYAoKVm90ZSBzaGFyZSBkaWZmZXJlbmNlIChEUFAgdi5zLiBLTVQpIHJhbmtlZCBieSByZWdpb24gYWNyb3NzIHRoZSBuYXRpb246CgpgYGB7ciBzaGFyZV9kaWZmX3JhbmtfYnlfcmVnaW9ufQpwX3JlZ2lvbl9yYW5rIDwtIHBfcmVnaW9uWywgLihCeSwgUmVnaW9uLCBTaGFyZV9EaWZmLCBWb3RlX0RpZmYpXQpwX3JlZ2lvbl9yYW5rIDwtIHBfcmVnaW9uX3JhbmtbLCBTaGFyZV9EaWZmOj1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZiwgLjAwMSldCnBfcmVnaW9uX3JhbmsgPC0gcF9yZWdpb25fcmFua1ssIGk6PS5JXQpzZXRjb2xvcmRlcihwX3JlZ2lvbl9yYW5rLCAiaSIpCnNldG5hbWVzKHBfcmVnaW9uX3JhbmssIGMoIuaOkuW6jyIsICLnuKPluIIiLCAi6YSJ6Y6u5biC5Y2AIiwgIue2oOiXjeW+l+elqOeOh+W3riIsICLntqDol43lvpfnpajmlbjlt64iKSkKcF9yZWdpb25fcmFua1tdCmBgYAoKV2UgYmFyLXBsb3QgdGhlIGFib3ZlIHJhbmtpbmcgYnkgcmVnaW9uIGJ5IGNvdW50eToKCiMjIyMjIE5vcnRoIFRhaXdhbgoKYGBge3IgcHJlc2lkZW50aWFsX25vcnRoX3JlZ2lvbl9iYXJfcGN0X2RpZmYsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTE3LCBmaWcud2lkdGg9OH0KcGxvdF9yZWdpb25fc2hhcmVfZGlmZigKICBub3J0aF9jb3VudGllcywKICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWMl+mDqOWcsOWNgO+8iOmEiemOruW4guWNgO+8ie+8mue2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKIyMjIyMgQ2VudHJhbCBUYWl3YW4KCmBgYHtyIHByZXNpZGVudGlhbF9jZW50cmFsX3JlZ2lvbl9iYXJfcGN0X2RpZmYsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTIwLCBmaWcud2lkdGg9OH0KcGxvdF9yZWdpb25fc2hhcmVfZGlmZigKICBjZW50cmFsX2NvdW50aWVzLAogIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45Lit6YOo5Zyw5Y2A77yI6YSJ6Y6u5biC5Y2A77yJ77ya57ag6JeN5b6X56Wo546H5beuIikKYGBgCgojIyMjIyBTb3V0aCBUYWl3YW4KCmBgYHtyIHByZXNpZGVudGlhbF9zb3V0aF9yZWdpb25fYmFyX3BjdF9kaWZmLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD0yMiwgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgc291dGhfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjljZfpg6jlnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyMjIEVhc3QgVGFpd2FuCgpgYGB7ciBwcmVzaWRlbnRpYWxfZWFzdF9yZWdpb25fYmFyX3BjdF9kaWZmLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9OH0KcGxvdF9yZWdpb25fc2hhcmVfZGlmZigKICBlYXN0X2NvdW50aWVzLAogIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45p2x6YOo5Zyw5Y2A77yI6YSJ6Y6u5biC5Y2A77yJ77ya57ag6JeN5b6X56Wo546H5beuIikKYGBgCgojIyMjIyBPdXRseWluZyBJc2xhbmRzCgpgYGB7ciBwcmVzaWRlbnRpYWxfaXNsYW5kX3JlZ2lvbl9iYXJfcGN0X2RpZmYsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD04fQpwbG90X3JlZ2lvbl9zaGFyZV9kaWZmKAogIGlzbGFuZF9jb3VudGllcywKICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOmbouWztuWcsOWNgO+8iOmEiemOruW4guWNgO+8ie+8mue2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKIyMjIOeEoeaViOelqCBJbnZhbGlkIFZvdGUgQ291bnRzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKW0ludmFsaWQgdm90ZXNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Nwb2lsdF92b3RlKSBhcmUgdm90ZXMgY2FzdCBidXQgZGVjbGFyZWQgaW52YWxpZC4KVGhlcmUgaXMgbm8gd2F5IHRvIG9iamVjdGl2ZWx5IHJlY29yZCB0aGUgaW50ZW50aW9uIG9mIGFuIGludmFsaWQgdm90ZSwKaGVyZSB3ZSBzaW1wbHkgc3RhdGlzdGljYWxseSBkZXNjcmliZSB0aGUgc2hhcmUgb2YgaW52YWxpZCB2b3RlcyBmcm9tIHRvdGFsIHZvdGVzIGNhc3QuCgojIyMjIEJ5IENvdW50eQoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfaW52YWxpZF92b3Rlc19jb3VudHksIHJlc3VsdHM9ImhpZGUifQojIFByb2Nlc3MgaW52YWxpZCB2b3RlcyBieSBjb3VudHkuCnBfY291bnR5IDwtIHBfY291bnR5WywgSW52YWxpZF9Wb3Rlc19TaGFyZTo9Z2V0KCLnhKHmlYjnpajmlbhCIikgLyBnZXQoIuaKleelqOaVuEMgQz1BK0IiKV0KcF9jb3VudHkgPC0gcF9jb3VudHlbLCBJbnZhbGlkX1ZvdGVzX1NoYXJlUDo9SW52YWxpZF9Wb3Rlc19TaGFyZSAqIDEwMF0KCiMgSm9pbiBpbnZhbGlkIHZvdGUgc2hhcmVzIHRvIHNwYXRpYWwgZGF0YWZyYW1lLgp0d19jb3VudHlfc2YgPC0gbWVyZ2UodHdfY291bnR5X3NmLCBwX2NvdW50eVssIC4oUmVnaW9uLCBJbnZhbGlkX1ZvdGVzX1NoYXJlUCldLCBieS54PSJOTF9OQU1FXzIiLCBieS55PSJSZWdpb24iKQpgYGAKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfYmFyX3BjdF9pbnZhbGlkLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBJbnZhbGlkIFZvdGUgU2hhcmVzIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5LCBhZXMoeD1yZW9yZGVyKENvdW50eSwgSW52YWxpZF9Wb3Rlc19TaGFyZSksIHk9SW52YWxpZF9Wb3Rlc19TaGFyZVApKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoSW52YWxpZF9Wb3Rlc19TaGFyZSkpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3lu6LnpajnjofmjpLluo/vvIkiLCB5PSLlu6LnpajnjofvvIUiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrlu6LnpajnjociKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKVG8gc2VlIHRoZSBnZW9sb2NhdGlvbmFsIGRpZmZlcmVuY2VzOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9tYXBfaW52YWxpZCwgZmlnLmNhcD0iQ2hvcm9wbGV0aCBNYXAgZm9yIEludmFsaWQgVm90ZSBTaGFyZXMifQpwIDwtIGdncGxvdCh0d19jb3VudHlfc2YsIGFlcyh0ZXh0PUNvdW50eSkpICsKICBnZW9tX3NmKGFlcyhmaWxsPUludmFsaWRfVm90ZXNfU2hhcmVQKSkgKwogIGNvb3JkX3NmKHhsaW09YygxMTgsIDEyMi41KSwgeWxpbT1jKDIxLjUsIDI2LjUpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChuYW1lPSLlu6LnpajnjofvvIUiLCBsb3c9IndoaXRlIiwgaGlnaD0iYmxhY2siKSArCiAgbGFicyh0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muW7ouelqOeOh++8hSIpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGNvcnJlbGF0aW9uIGJldHdlZW4gaW52YWxpZCB2b3RlcyBhbmQgdGhlIERQUC1LTVQgZGlmZmVyZW5jZXM6CgpgYGB7ciBwcmVzaWRlbnRpYWxfaW52YWxpZF92c2RfY291bnR5LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gSW52YWxpZCBWb3RlIFNoYXJlcyB2cyBEUFAtS01UIFNoYXJlIERpZmZlcmVuY2VzIGJ5IENvdW50eSJ9CmdncGxvdChwX2NvdW50eSwgYWVzKHg9SW52YWxpZF9Wb3Rlc19TaGFyZSwgeT1TaGFyZV9EaWZmLCBsYWJlbD1Db3VudHkpKSArCiAgZ2VvbV9wb2ludChzaGFwZT00LCBzaXplPTQsIHN0cm9rZT0yKSArCiAgbGFicyh4PSLlu6LnpajnjociLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrlu6LnpajnjofvvLjntqDol43lvpfnpajnjoflt64iKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGNvbG9yPSJncmV5NDAiKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSBTdWItUmVnaW9uCgpgYGB7ciBwcm9jZXNzX3ByZXNpZGVudGlhbF9pbnZhbGlkX3ZvdGVzX3JlZ2lvbiwgcmVzdWx0cz0iaGlkZSJ9CiMgUHJvY2VzcyBpbnZhbGlkIHZvdGVzIGJ5IHJlZ2lvbi4KcF9yZWdpb24gPC0gcF9yZWdpb25bLCBJbnZhbGlkX1ZvdGVzX1NoYXJlOj1nZXQoIueEoeaViOelqOaVuEIiKSAvIGdldCgi5oqV56Wo5pW4QyBDPUErQiIpXQpwX3JlZ2lvbiA8LSBwX3JlZ2lvblssIEludmFsaWRfVm90ZXNfU2hhcmVQOj1JbnZhbGlkX1ZvdGVzX1NoYXJlICogMTAwXQpgYGAKCmBgYHtyIHByZXNpZGVudGlhbF9pbnZhbGlkX3ZzZF9yZWdpb24sIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIEludmFsaWQgVm90ZSBTaGFyZXMgdnMgRFBQLUtNVCBTaGFyZSBEaWZmZXJlbmNlcyBieSBSZWdpb24ifQpwIDwtIGdncGxvdChwX3JlZ2lvbiwgYWVzKHg9SW52YWxpZF9Wb3Rlc19TaGFyZSwgeT1TaGFyZV9EaWZmLCBsYWJlbD1wYXN0ZShCeSwgUmVnaW9uKSkpICsKICBnZW9tX3BvaW50KHNoYXBlPTQsIHNpemU9NCkgKwogIGxhYnMoeD0i5bui56Wo546HIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE6YSJ6Y6u5biC5Y2A77ya5bui56Wo546H77y457ag6JeN5b6X56Wo546H5beuIikgKwogICAgICAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSJibGFjayIpCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpBIHNpbXBsZSBsaW5lYXIgbW9kZWwgb24gaW52YWxpZCB2b3RlIHNoYXJlcyBhZ2FpbnN0IERQUC1LTVQgc2hhcmUgZGlmZmVyZW5jZXMgc3VnZ2VzdHMgdGhlIGNvcnJlbGF0aW9uIGlzIGF0IGxlYXN0IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuCkJ1dCBzdWNoIGNvcnJlbGF0aW9uIG1heSBiZSBbKnNwdXJpb3VzKl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3B1cmlvdXNfcmVsYXRpb25zaGlwKSBzbyB0aGUgaW50ZXJwcmV0YXRpb24gc2hhbGwgYmUgY2F1dGlvdXMuCgpgYGB7ciBsbV9pbnZhbGlkfQpsbV9pbnZhbGlkIDwtIGxtKFNoYXJlX0RpZmYgfiBJbnZhbGlkX1ZvdGVzX1NoYXJlUCwgZGF0YT1wX3JlZ2lvbikKY29lZnRlc3QobG1faW52YWxpZCwgdmNvdj12Y292SEMobG1faW52YWxpZCwgdHlwZT0iSEMwIikpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyDmipXnpajnjocgVm90ZXIgVHVybm91dCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCltWb3RlciB0dXJub3V0XShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Wb3Rlcl90dXJub3V0KSBpcyBkZWZpbmVkIGFzIHRvdGFsIHZvdGVzIGNhc3QgKHZhbGlkIGFuZCBpbnZhbGlkKSBkaXZpZGVkIGJ5IGxlZ2l0aW1hdGUgdm90ZXJzLgpUaGUgaW5mb3JtYXRpb24gaXMgcmVhZGlseSBhdmFpbGFibGUgaW4gdGhlIHNvdXJjZSBkYXRhIGZyb20gdGhlIGNvbHVtbiBg5oqV56Wo546HSCBIPUPDt0dgLgpJbiB0aGlzIHNlY3Rpb24gd2UgZXhwbG9yZSB0aGUgcG9zc2libGUgcmVsYXRpb24gYmV0d2VlbiB0dXJub3V0IGFuZCB2b3RlIGNvdW50cy4KCiMjIyMgQnkgQ291bnR5CgpgYGB7ciBwcm9jZXNzX3ByZXNpZGVudGlhbF9jb3VudHlfdHVybm91dCwgcmVzdWx0cz0iaGlkZSJ9CiMgR2V0IHZvdGluZyByYXRlIGZyb20gd2lkZSBkYXRhIHRvIGxvbmcuCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFtwX2NvdW50eSwgVHVybm91dDo9aS5UdXJub3V0LCBvbj0uKENvdW50eSldCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV90dXJub3V0X2JhciwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCBieSBDb3VudHkifQpwIDwtIGdncGxvdChwX2NvdW50eSwgYWVzKHg9cmVvcmRlcihDb3VudHksIFR1cm5vdXQpLCB5PVR1cm5vdXQpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgZmlsbD0id2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wYXN0ZShUdXJub3V0LCAiJSIpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIuNSkgKwogIGxhYnMoeD0i57ij5biC77yI5L6d5oqV56Wo546H5o6S5bqP77yJIiwgeT0i5oqV56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546HIikgKwogIGNvb3JkX2ZsaXAoKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwLCB0b29sdGlwPU5VTEwpCmBgYAoKSXQgaXMgd2lkZWx5IHN1Z2dlc3RlZCB0aGF0IGFuIGluY3JlYXNpbmcgdm90ZXIgdHVybm91dCBkdWUgdG8geW91bmdlciBnZW5lcmF0aW9uIHRoaXMgdGltZSBjYW4gaHVnZWx5IGltcGFjdCB0aGUgcmVzdWx0cy4KSGVyZSB3ZSBwbG90IHRoZSB0dXJub3V0IGFnYWluc3QgRFBQLUtNVCBzaGFyZSBkaWZmZXJlbmNlcyBieSBjb3VudHk6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXRfdnNkLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCBieSBDb3VudHkifQpnZ3Bsb3QocF9jb3VudHksIGFlcyh4PVR1cm5vdXQsIHk9U2hhcmVfRGlmZiwgbGFiZWw9Q291bnR5KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9YygzNSwgODApKSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9jb3VudHlbMV0sCiAgICAgICAgICAgIGFlcyh4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPTAsIHltYXg9SW5mKSwgZmlsbD0ibGlnaHRncmVlbiIsIGFscGhhPS44KSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9jb3VudHlbMV0sCiAgICAgICAgICAgIGFlcyh4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9MCksIGZpbGw9ImxpZ2h0Ymx1ZSIsIGFscGhhPS44KSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD0wKSwgY29sb3I9InJlZCIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArCiAgZ2VvbV90ZXh0KGNoZWNrX292ZXJsYXA9VFJVRSwgY29sb3I9ImdyZXk0MCIpICsKICBsYWJzKHg9IuaKleelqOeOh++8hSIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muaKleelqOeOh++8uOiXjee2oOW+l+elqOeOh+W3riIpCmBgYAoKV2Ugem9vbS1pbiBpbiB0aGUgZm9sbG93aW5nIHBsb3QgZm9yIHRob3NlIHdpdGggdHVybm91dCA+IDcwJToKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfdHVybm91dDcwX3ZzZCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgKD43MCUpIGJ5IENvdW50eSJ9CmdncGxvdChwX2NvdW50eVtUdXJub3V0ID4gNzBdLCBhZXMoeD1UdXJub3V0LCB5PVNoYXJlX0RpZmYsIGxhYmVsPUNvdW50eSkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoNzAsIDgwKSkgKwogIGdlb21fcmVjdChkYXRhPXBfY291bnR5W1R1cm5vdXQgPiA3MF1bMV0sCiAgICAgICAgICAgIGFlcyh4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPTAsIHltYXg9SW5mKSwgZmlsbD0ibGlnaHRncmVlbiIsIGFscGhhPS44KSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9jb3VudHlbVHVybm91dCA+IDcwXVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD0wKSwgZmlsbD0ibGlnaHRibHVlIiwgYWxwaGE9LjgpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0icmVkIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGNvbG9yPSJncmV5NDAiKSArCiAgbGFicyh4PSLmipXnpajnjofvvIUiLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrmipXnpajnjocoPjcwJSnvvLjntqDol43lvpfnpajnjoflt64iKQpgYGAKCldlIGNhbiBhbHNvIHZpc3VhbGl6ZSB0aGUgdHVybm91dCByZWxhdGlvbiBvbiBlYWNoIHBhcnR5IGNhbmRpZGF0ZSBpbnN0ZWFkOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV90dXJub3V0X3ZzLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9MywgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCB2cyBDYW5kaWRhdGUgVm90ZSBTaGFyZXMgYnkgQ291bnR5In0KZ2dwbG90KHBfY291bnR5X2wsIGFlcyh4PVR1cm5vdXQsIHk9Vm90ZXNfU2hhcmUpKSArCiAgZ2VvbV9yZWN0KGRhdGE9dW5pcXVlKHBfY291bnR5X2wsIGJ5PSJDYW5kaWRhdGUiKSwgYWVzKGZpbGw9Q2FuZGlkYXRlKSwKICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZiwgYWxwaGE9LjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgY29sb3I9ImJsYWNrIikgKwogIGZhY2V0X2dyaWQofiBDYW5kaWRhdGUpICsKICBsYWJzKHg9IuaKleelqOeOh++8hSIsIHk9IuW+l+elqOeOhyIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muaKleelqOeOh++8uOW+l+elqOeOhyIpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgQnkgQ291bnR5IFN1Yi1SZWdpb24KCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX3JlZ2lvbl90dXJub3V0fQojIENvbXB1dGUgcmVnaW9uLWxldmVsIHZvdGluZyByYXRlIGFuZCB2b3RlIHNoYXJlcyBpbiB0aGUgbG9uZyBkYXRhLgpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbcF9yZWdpb24sIFR1cm5vdXQ6PWkuVHVybm91dCwgb249LihSZWdpb24pXQpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbLCBWb3Rlc19TaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpLCBieT0uKFJlZ2lvbildCmBgYAoKRnJvbSB0aGUgcHJldmlvdXMgY291bnR5LWxldmVsIHZpc3VhbGl6YXRpb24gd2UgcmVhbGl6ZWQgdGhhdCB0dXJub3V0IG1heSBiZSByZWxhdGVkIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gRERQIGFuZCBLTVQgY2FuZGlkYXRlcy4KSGVyZSB3ZSB1c2UgYSBzaW1wbGUgbGluZWFyIG1vZGVsIHRvIHRlc3QgdGhlIGNvcnJlbGF0aW9uIGJhc2VkIG9uIHJlZ2lvbi1sZXZlbCBkYXRhOgoKYGBge3IgbG1fdHVybm91dF92c2R9CmxtX3R1cm5vdXQgPC0gbG0oU2hhcmVfRGlmZiB+IFR1cm5vdXQsIGRhdGE9cF9yZWdpb25fbCkKY29lZnRlc3QobG1fdHVybm91dCwgdmNvdj12Y292SEMobG1fdHVybm91dCwgdHlwZT0iSEMwIikpCmBgYAoKQXBwYXJlbnRseSB0aGUgY29ycmVsYXRpb24gaXMgc2lnbmlmaWNhbnQuCkxldCdzIGFsc28gZ2VuZXJhdGUgdGhlIHJlZ2lvbi1sZXZlbCBzY2F0dGVycGxvdDoKCmBgYHtyIHByZXNpZGVudGlhbF9yZWdpb25fdHVybm91dF92c2QsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IGJ5IFJlZ2lvbiJ9CmdncGxvdChwX3JlZ2lvbiwgYWVzKHg9VHVybm91dCwgeT1TaGFyZV9EaWZmKSkgKwogIGdlb21fcmVjdChkYXRhPXBfcmVnaW9uWzFdLCBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0wLCB5bWF4PUluZiksCiAgICAgICAgICAgIGZpbGw9ImxpZ2h0Z3JlZW4iLCBhbHBoYT0uOCkgKwogIGdlb21fcmVjdChkYXRhPXBfcmVnaW9uWzFdLCBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PTApLAogICAgICAgICAgICBmaWxsPSJsaWdodGJsdWUiLCBhbHBoYT0uOCkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGNvbG9yPSJyZWQiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIikgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE6YSJ6Y6u5biC5Y2A77ya5oqV56Wo546H77y457ag6JeN5b6X56Wo546H5beuIikKYGBgCgpBZ2FpbiB3aXRoIGFkZGl0aW9uYWwgem9vbS1pbjoKCmBgYHtyIHByZXNpZGVudGlhbF9yZWdpb25fdHVybm91dDcwX3ZzZCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgKD43MCUpIGJ5IFJlZ2lvbiJ9CmdncGxvdChwX3JlZ2lvbltUdXJub3V0ID4gNzBdLCBhZXMoeD1UdXJub3V0LCB5PVNoYXJlX0RpZmYsIGxhYmVsPVJlZ2lvbikpICsKICBnZW9tX3JlY3QoZGF0YT1wX3JlZ2lvblsxXSwgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLAogICAgICAgICAgICBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX3JlZ2lvblsxXSwgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD0wKSwKICAgICAgICAgICAgZmlsbD0ibGlnaHRibHVlIiwgYWxwaGE9LjgpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0icmVkIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPUZBTFNFKSArCiAgZ2VvbV90ZXh0KGNoZWNrX292ZXJsYXA9VFJVRSwgbnVkZ2VfeT0tLjAzNSwgY29sb3I9ImRhcmtncmV5IikgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE6YSJ6Y6u5biC5Y2A77ya5oqV56Wo546HKD43MCUp77y457ag6JeN5b6X56Wo546H5beuIikKYGBgCgpXZSBjYW4gYWxzbyB0ZXN0IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHR1cm5vdXQgYW5kIHZvdGUgc2hhcmUgb2YgZWFjaCBwYXJ0eSdzIGNhbmRpZGF0ZXM6CgpgYGB7ciBsbV92cl92c30KZm9yICggY2FuZGlkYXRlIGluIHVuaXF1ZShwX3JlZ2lvbl9sJENhbmRpZGF0ZSkgKSB7CiAgbG1fdHVybm91dF9jYW5kaWRpYXRlIDwtIGxtKFZvdGVzX1NoYXJlIH4gVHVybm91dCwgZGF0YT1wX3JlZ2lvbl9sW0NhbmRpZGF0ZSA9PSBjYW5kaWRhdGVdKQogIG1lc3NhZ2UocmVwKCItIiwgODApKQogIG1lc3NhZ2UoIlRlc3QgY29ycmVsYXRpb24gYmV0d2VlbiB2b3RlIHNoYXJlcyBhbmQgdm90ZXIgdHVybm91dC4iKQogIG1lc3NhZ2Uoc3ByaW50ZigiRm9yICVzOiIsIGNhbmRpZGF0ZSkpCiAgcHJpbnQoY29lZnRlc3QobG1fdHVybm91dF9jYW5kaWRpYXRlLCB2Y292PXZjb3ZIQyhsbV90dXJub3V0X2NhbmRpZGlhdGUsIHR5cGU9IkhDMCIpKSkKfQpgYGAKCkludGVyZXN0aW5nbHksCnN1Y2ggY29ycmVsYXRpb24gaXMgbm90IGZvdW5kIGZvciBQRlAgY2FuZGlkYXRlcy4KCmBgYHtyIHByZXNpZGVudGlhbF9yZWdpb25fdnJfdnMsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IHZzIENhbmRpZGF0ZSBWb3RlIFNoYXJlcyBieSBSZWdpb24ifQpnZ3Bsb3QocF9yZWdpb25fbCwgYWVzKHg9VHVybm91dCwgeT1Wb3Rlc19TaGFyZSkpICsKICBnZW9tX3JlY3QoZGF0YT11bmlxdWUocF9yZWdpb25fbCwgYnk9IkNhbmRpZGF0ZSIpLCBhZXMoZmlsbD1DYW5kaWRhdGUpLAogICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mLCBhbHBoYT0uNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iYmxhY2siKSArCiAgZmFjZXRfZ3JpZCh+IENhbmRpZGF0ZSkgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546HIFgg5b6X56Wo546HIikKYGBgCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIyBCeSBQb2xsaW5nIFBsYWNlCgpUQkMuCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMg56ys5Y2B5bGG56uL5rOV5aeU5ZOh6YG46IiJ57WQ5p6cIFRoZSAxMHRoIExlZ2lzbGF0aXZlIEVsZWN0aW9uIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMg5LiN5YiG5Y2A56uL5aeUIFBhcnR5IExpc3Qgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpgYGB7ciBwcm9jZXNzX3BhcnR5X2xpc3RfcmVzdWx0cywgcmVzdWx0cz0iaGlkZSJ9CnBhcnR5bGlzdCA8LSBmcmVhZCgiZGF0YS9wcm9jZXNzZWQvbGVnaXNsYXRpdmUvbGVnaXNsYXRpdmVf56ysMTDlsYblhajlnIvkuI3liIbljYDlj4rlg5HlsYXlnIvlpJblnIvmsJHnq4vms5Xlp5Tlk6EuY3N2IiwgZW5jb2Rpbmc9IlVURi04IikKcGFydHlsaXN0IDwtIHBhcnR5bGlzdFssIFJlZ2lvbjo9dHJpbXdzKFJlZ2lvbiwgd2hpdGVzcGFjZT0iW1xcaFxcdl0iKV0gICMgVHJpbSBmdWxsLXdpZHRoIHdoaXRlIHNwYWNlLgpjb2xzX2FyZWEgPC0gYygiQnkiLCAiUmVnaW9uIiwgIlZpbGxhZ2UiLCAiUGxhY2UiKQpjb2xzX3BhcnR5IDwtIG5hbWVzKHBhcnR5bGlzdClbNzoyNV0gICMgVGhlcmUgYXJlIDE5IHBhcnRpZXMgaW4gdG90YWwuCnBhcnR5bGlzdF9sIDwtIG1lbHQocGFydHlsaXN0WywgYyhjb2xzX2FyZWEsIGNvbHNfcGFydHkpLCB3aXRoPUZBTFNFXSwKICAgICAgICAgICAgICAgICAgIGlkLnZhcnM9Y29sc19hcmVhLCB2YXJpYWJsZS5uYW1lPSJQYXJ0eSIsIHZhbHVlLm5hbWU9IlZvdGVzIikKcGFydHlsaXN0X2wgPC0gcGFydHlsaXN0X2xbLCBQYXJ0eTo9ZmFjdG9yKFBhcnR5KV0KcGFydHlsaXN0X2ZpbmFsIDwtIHBhcnR5bGlzdF9sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihQYXJ0eSldCnBhcnR5bGlzdF9maW5hbCA8LSBwYXJ0eWxpc3RfZmluYWxbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpXQpgYGAKCkZvciBwYXJ0eSBsaXN0IHRvIHNlY3VyZSBhdCBsZWFzdCBvbmUgc2VhdCBpbiBbTGVnaXNsYXRpdmUgWXVhbl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGVnaXNsYXRpdmVfWXVhbiksCml0IG11c3Qgb2J0YWluIG1pbmltYWxseSA1JSBvZiBwYXJ0eS1saXN0IHZvdGVzLgpJZiBhIHBhcnR5IGNhbm5vdCBwYXNzIHRoZSA1JSB0aHJlc2hvbGQgYnV0IHBhc3MgdGhlIDMlIHRocmVzaG9sZCwKaXQgd2lsbCBiZSBzcG9uc29yZWQgYnkgdGhlIGdvdmVybm1lbnQgaW4gdGhlIGZvbGxvd2luZyA0IHllYXJzIChiYXNlZCBvbiBudW1iZXIgb2Ygdm90ZXMgb2J0YWluZWQpLgpUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIHNtYWxsIHBhcnRpZXMgdG8gY292ZXIgdGhlaXIgb3BlcmF0aW5nIGNvc3RzLgoKYGBge3IgcGFydHlsaXN0X2ZpbmFsX3Jlc3VsdCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gUGFydHkgTGlzdCBGaW5hbCBPdXRjb21lIn0KdGhyZXNfMDAzIDwtIHN1bShwYXJ0eWxpc3RfZmluYWwkVm90ZXMpICogLjAzCnRocmVzXzAwNSA8LSBzdW0ocGFydHlsaXN0X2ZpbmFsJFZvdGVzKSAqIC4wNQoKZ2dwbG90KHBhcnR5bGlzdF9maW5hbCwgYWVzKHg9cmVvcmRlcihQYXJ0eSwgVm90ZXMpLCB5PVZvdGVzKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnMoeD0i5pS/6buoIiwgeT0i5b6X56Wo5pW4IiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj5LiN5YiG5Y2A56uL5aeU6YG46IiJ57WQ5p6cIikgKwogIGdlb21fdGV4dChhZXMoeD1QYXJ0eSwgeT1Wb3RlcywKICAgICAgICAgICAgICAgIGxhYmVsPXNwcmludGYoIiVzICglcykiLCBzY2FsZXM6OmNvbW1hKFZvdGVzKSwgc2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSksCiAgICAgICAgICAgIHNpemU9MywgaGp1c3Q9LS4wNSkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpjb21tYSwgbGltaXRzPWMoMCwgbWF4KHBhcnR5bGlzdF9maW5hbCRWb3RlcykgKiAxLjI1KSkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9dGhyZXNfMDAzLCBjb2xvcj0i6KOc5YqpIFNwb25zb3JzaGlwIiksIGxpbmV0eXBlPTMpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PXRocmVzXzAwNSwgY29sb3I9IuW4reasoSBTZWF0cyIpLCBsaW5ldHlwZT0zKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbChuYW1lPSLploDmqrsgVGhyZXNob2xkIiwgdmFsdWVzPWMoInJlZCIsICJncmVlbiIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKIyMjIyBCeSBDb3VudHkKCldlIGdyb3VwIHBhcnRpZXMgd2l0aCBsZXNzIHRoYW4gMiUgdm90ZXMgaW50byAib3RoZXJzIiB0byBtYWtlIHRoZSByZXN0IG9mIHRoZSBwbG90cyBlYXNpZXIgdG8gcmVhZC4KCmBgYHtyIHByb2Nlc3NfcGFydHlfbGlzdF9jb3VudHksIHJlc3VsdHM9ImhpZGUifQpwYXJ0eWxpc3RfY291bnR5IDwtIHBhcnR5bGlzdF9sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUGFydHkpXQpzbWFsbF9wYXJ0aWVzIDwtIHBhcnR5bGlzdF9maW5hbFtTaGFyZSA8IC4wMiwgUGFydHldCgpwYXJ0eWxpc3RfY291bnR5IDwtIHBhcnR5bGlzdF9jb3VudHlbUGFydHkgJWluJSBzbWFsbF9wYXJ0aWVzLCBQYXJ0eTo9IuWFtuS7liJdCnBhcnR5bGlzdF9jb3VudHkgPC0gcGFydHlsaXN0X2NvdW50eVssIFBhcnR5Oj1mYWN0b3IoUGFydHkpXSAgIyBSZW5ldyBsZXZlbC4KcGFydHlsaXN0X2NvdW50eSA8LSBwYXJ0eWxpc3RfY291bnR5WywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUGFydHkpXSAgIyBSZS1ncm91cC4KcGFydHlsaXN0X2NvdW50eSA8LSBwYXJ0eWxpc3RfY291bnR5WywgU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKSwgYnk9LihCeSldCgojIENvbXB1dGUgRFBQLUtNVCBzaGFyZSBkaWZmZXJlbmNlcy4KcGFydHlsaXN0X2NvdW50eV9nYiA8LSBwYXJ0eWxpc3RfY291bnR5W1BhcnR5ICVpbiUgYygiKDE0KSAg5rCR5Li76YCy5q2l6buoIiwgIig5KSAg5Lit5ZyL5ZyL5rCR6buoIildCnNldG9yZGVyKHBhcnR5bGlzdF9jb3VudHlfZ2IsIEJ5LCBQYXJ0eSkKcGFydHlsaXN0X2NvdW50eV9nYl9kaWZmIDwtIHBhcnR5bGlzdF9jb3VudHlfZ2JbLCAuKFNoYXJlX0RpZmY9U2hhcmVbMl0gLSBTaGFyZVsxXSksIGJ5PS4oQnkpXQpwYXJ0eWxpc3RfY291bnR5X2diX2RpZmYgPC0gcGFydHlsaXN0X2NvdW50eV9nYl9kaWZmWywgZHBwX3dpbjo9U2hhcmVfRGlmZiA+IDBdCmBgYAoKYGBge3IgcGFydHlfbGlzdF9jb3VudHksIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIExlZ2lzbGF0aXZlIEVsZWN0aW9uIFBhcnR5IExpc3QgVm90ZSBTaGFyZXMgYnkgQ291bnR5In0KcGFydHlfY29sb3JzIDwtIGMoImRhcmtvcmFuZ2UiLCAiZGFya2dyZWVuIiwgInllbGxvdyIsICJkb2RnZXJibHVlIiwgImdyZWVuIiwgImdyZWVuMyIsICJsaWdodGJsdWUiLCAiZ3JleSIpCmdncGxvdChwYXJ0eWxpc3RfY291bnR5LCBhZXMoeD1yZW9yZGVyKEJ5LCBWb3RlcyksIHk9U2hhcmUsIGZpbGw9UGFydHkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0ic3RhY2siLCB3aWR0aD0uOCkgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlLCAuMDEpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIsIGFuZ2xlPTIwKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZT0i5pS/6buoIiwgdmFsdWVzPXBhcnR5X2NvbG9ycykgKwogIGxhYnMoeD0i57ij5biC77yI5L6d57i956Wo5pW45o6S5bqP77yJIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj5LiN5YiG5Y2A56uL5aeU5ZCE57ij5biC5pS/6buo5b6X56Wo546HIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQpgYGAKCmBgYHtyIHBhcnR5X2xpc3RfZHBwX2ttdF9kaWZmLCBmaWcuY2FwPSIyMDIwIExlZ2lzbGF0aXZlIEVsZWN0aW9uIFBhcnR5IExpc3QgRFBQLUtNVCBTaGFyZSBEaWZmZXJlbmNlIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBhcnR5bGlzdF9jb3VudHlfZ2JfZGlmZiwgYWVzKHg9cmVvcmRlcihCeSwgU2hhcmVfRGlmZiksIGZpbGw9ZHBwX3dpbiwgeT1TaGFyZV9EaWZmKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iiwgd2lkdGg9LjgsIGNvbG9yPSJibGFjayIsIGFscGhhPS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoImRvZGdlcmJsdWUiLCAiZ3JlZW4zIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmVfRGlmZikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3lvpfnpajnjoflt67mjpLluo/vvIkiLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPkuI3liIbljYDnq4vlp5TlkITnuKPluILvvJrntqDol43lvpfnpajnjoflt64iKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDApCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgQnkgQ291bnR5IFN1Yi1SZWdpb24KCmBgYHtyIHByb2Nlc3NfcGFydHlfbGlzdF9yZWdpb24sIHJlc3VsdHM9ImhpZGUifQojIFByb2Nlc3MgcmVnaW9uLWxldmVsIHBhcnR5IGxpc3QgcmVzdWx0cy4KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfbFssIC4oVm90ZXM9c3VtKFZvdGVzKSksIGJ5PS4oQnksIFJlZ2lvbiwgUGFydHkpXQpwYXJ0eWxpc3RfcmVnaW9uIDwtIHBhcnR5bGlzdF9yZWdpb25bLCBQYXJ0eTo9ZmFjdG9yKFBhcnR5KV0gICMgUmVuZXcgbGV2ZWwuCnBhcnR5bGlzdF9yZWdpb24gPC0gcGFydHlsaXN0X3JlZ2lvblssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oQnksIFJlZ2lvbildCnBhcnR5bGlzdF9yZWdpb24gPC0gcGFydHlsaXN0X3JlZ2lvblshUGFydHkgJWluJSBzbWFsbF9wYXJ0aWVzXSAgIyBJZ25vcmUgc21hbGwgcGFydGllcy4KCiMgR2V0IHByZXNpZGVudGlhbCBpbnZhbGlkIHZvdGUgc2hhcmUgYW5kIHR1cm5vdXQuCnBhcnR5bGlzdF9yZWdpb24gPC0gcGFydHlsaXN0X3JlZ2lvbltwX3JlZ2lvbiwgYDo9YCgKICBQX0ludmFsaWRfVm90ZXNfU2hhcmU9aS5JbnZhbGlkX1ZvdGVzX1NoYXJlLAogIFBfVHVybm91dD1pLlR1cm5vdXQKICApLCBvbj0uKEJ5LCBSZWdpb24pXQoKIyBHZXQgcHJlc2lkZW50aWFsIHZvdGUgcmVzdWx0cy4KcF9yZWdpb25fbCA8LSBwX3JlZ2lvbl9sWywgUF9TaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpLCBieT0uKEJ5LCBSZWdpb24pXQpwYXJ0eWxpc3RfcmVnaW9uIDwtIG1lcmdlKHBhcnR5bGlzdF9yZWdpb24sIHBfcmVnaW9uX2xbLCAuKEJ5LCBSZWdpb24sIENhbmRpZGF0ZSwgUF9TaGFyZSwgU2hhcmVfRGlmZildLCBieT1jKCJCeSIsICJSZWdpb24iKSwgYWxsb3cuY2FydGVzaWFuPVRSVUUpCgojIEhlbHBlciBmdW5jdGlvbiBmb3Igc2NhdHRlciBwbG90LgpzY2F0dGVycGxvdCA8LSBmdW5jdGlvbigpIHsKICBnZ3Bsb3QocGFydHlsaXN0X3JlZ2lvbiwgYWVzKHg9U2hhcmUsIHk9UF9TaGFyZSwgY29sb3I9Q2FuZGlkYXRlKSkgKwogICAgZ2VvbV9yZWN0KGRhdGE9dW5pcXVlKHBhcnR5bGlzdF9yZWdpb24sIGJ5PWMoIlBhcnR5IiwgIkNhbmRpZGF0ZSIpKSwgYWVzKGZpbGw9UGFydHkpLAogICAgICAgICAgICAgIHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD1JbmYsIGFscGhhPS4yNSkgKwogICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPXBhcnR5X2NvbG9ycykgKwogICAgZ2VvbV9wb2ludChzaXplPS41KSArCiAgICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgYWVzKGNvbG9yPUNhbmRpZGF0ZSkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICAgIGxhYnMoeD0i57i957Wx5YCZ6YG45Lq65b6X56Wo546HIiwgeT0i5LiN5YiG5Y2A5pS/6buo5b6X56Wo546HIiwKICAgICAgICAgdGl0bGU9IjIwMjDnuL3ntbHlgJnpgbjkurrlvpfnpajnjofvvLjkuI3liIbljYDmlL/pu6jlvpfnpajnjociKSArCiAgICBmYWNldF93cmFwKFBhcnR5IH4gQ2FuZGlkYXRlLCBuY29sPTMsIHNjYWxlcz0iZnJlZSIpCn0KYGBgCgpXZSBjYW4gcGxvdCB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiBwcmVzaWRlbnRpYWwgY2FuZGlkYXRlIHZvdGUgc2hhcmVzIGFuZCBwYXJ0eSB2b3RlIHNoYXJlcyBhdCByZWdpb24gbGV2ZWwuCkJ1dCB3ZSBtdXN0IGJlIHZlcnkgY2FyZWZ1bCBpbiBpbnRlcnByZXRpbmcgdGhlIHJlbGF0aW9uIHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIGRpcmVjdGlvbiBvZiBzdWNoIHJlbGF0aW9uLCBpZiBhbnkuClN0cmljdGx5IHNwZWFraW5nLAp3ZSBkb24ndCBldmVuIGtub3cgd2hldGhlciB0aGV5IGFyZSBjYXVzYWxseSByZWxhdGVkIGF0IGFsbC4KCmBgYHtyLCBmaWcuaGVpZ2h0PTE1LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBQYXJ0eSBMaXN0IFNoYXJlcyB2LnMuIFByZXNpZGVudGlhbCBWb3RlcyJ9CnNjYXR0ZXJwbG90KCkKYGBgCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIOWIhuWNgOeri+WnlCBDb25zdGl0dWVuY3kgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpUQkMuCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyBSZWZlcmVuY2VzIG9uIFIgUGFja2FnZXMK